# -*- coding: utf8 -*-
"""
Created on Thu Oct 25 22:07:15 2012

@author: Ago

"""
#from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import QSettings#, Qt
import os, time, shutil, Image
#from PIL import Image
#from PIL import Image
import vtk
#from PyQt4.QtCore import QSettings, QPoint



class Krajec(object):
    ## Uchovává unikátní Singleton instance-
    _iInstance = None
 
    ## Class used with this Python singleton design pattern
    #  @ Todo Přidat všechny proměnné a metody potřebné pro Singleton třídu níže     
    class Singleton:
        def __init__(self):
            ## a foo class variable
            self.foo = None 
            self.foo1 = None
            
    
    def __init__(self):
              
        if Krajec._iInstance is None:
            # Create and remember instanc
            Krajec._iInstance = Krajec.Singleton()
 
        # Vytvoření a pamatovat si instanc 
        self._EventHandler_instance = Krajec._iInstance
 
 
    ## Delegát přístup k implementaci.
    #  @param self The object pointer.
    #  @param attr Attribute wanted.
    #  @return Attribute
    def __getattr__(self, aAttr):
        return getattr(self._iInstance, aAttr)
 
 
    ## Delegát přístup k implementaci.
    #  @param self The object pointer.
    #  @param attr Attribute wanted.
    #  @param value Vaule to be set.
    #  @return Result of operation.
    def __setattr__(self, aAttr, aValue):
        return setattr(self._iInstance, aAttr, aValue)
     
        
 
    def platek(self, insSV, instSp, fileName, tlRezu, nRezu, zvetsit, cas, zmensit, rozlisX, rozlisY, korekceX):
        self.insSV = insSV
        self.instSp = instSp
        self.instSp.listWidget.addItem("Instance - Krajec ")
        self.rozlisX= rozlisX
        self.rozlisY= rozlisY 
        self.korekceX= korekceX
        self.par =1000
        self.tlRezu=tlRezu/float(1000) # Tloušťka řezu mikrony
        self.fileName =str(fileName)
        self.cas = cas
        
        settings = QSettings("data.ini", QSettings.IniFormat)
        self.rotateKoef = settings.value('rotateKoef', type = float)
        self.rotateKoefX = settings.value('rotateKoefX', type = float)
        self.rotateKoefY = settings.value('rotateKoefY', type = float)
        
        if zmensit:
            zvetsit=zvetsit*-1  # Zmenšuje
            
        self.zvets= zvetsit*0.01+1.87  #0.955
        #print self.fileName
        # První start - čtení  model. Také vytváří povrch. normál pro hezčí vykreslování.
        model = vtk.vtkSTLReader()
        model.SetFileName(self.fileName)
        
        cowNormals1 = vtk.vtkPolyDataNormals()
        cowNormals1.SetInputConnection(model.GetOutputPort())
        cowNormals = vtk.vtkTriangleFilter()
        cowNormals.SetInputConnection(cowNormals1.GetOutputPort())        
#        cowNormals = vtk.vtkCleanPolyData()
#        cowNormals.SetInputConnection(cowNormals2.GetOutputPort())        
        
        ren = vtk.vtkRenderer()
        renWin = vtk.vtkRenderWindow()
        renWin.AddRenderer(ren)
        iren = vtk.vtkRenderWindowInteractor()
        iren.SetRenderWindow(renWin)
        
        transform = vtk.vtkTransform()
        transform.RotateWXYZ(self.rotateKoef,self.rotateKoefX,self.rotateKoefY,0)
        transform.Scale(1, 1, 1)
        transF = vtk.vtkTransformPolyDataFilter()
        transF.SetInputConnection(model.GetOutputPort())
        transF.SetTransform(transform)
        
        plane = vtk.vtkPlane()
        plane.SetOrigin(0, 0, 40.00) # výška řezu
        plane.SetNormal(0, 0.0000001, -0.01)  # keep everything in direction of normal
        xplaneColl = vtk.vtkPlaneCollection()
        xplaneColl.AddItem(plane)   
        
        plane1 = vtk.vtkPlane()
        plane1.SetOrigin(0, 0, 39.95) # výška řezu -zobrazení v okně
        plane1.SetNormal(0, 0.0000001, 0.01)  # náklon - bez náklonu chyby
        xplaneColl1 = vtk.vtkPlaneCollection()
        xplaneColl1.AddItem(plane1)
        
        clip = vtk.vtkClipClosedSurface()
        clip.SetClippingPlanes(xplaneColl)
        clip.SetInputConnection(transF.GetOutputPort()) #(glyphs.GetOutputPort())
        #clip.SetActivePlaneColor(1.0,0,0)
        clip.GenerateFacesOff()
        clip.GenerateFacesOn()
        
        normalsM = vtk.vtkPolyDataNormals()
        normalsM.SetInputConnection(clip.GetOutputPort())
        normalsM.FlipNormalsOn()        
        
        clip1 = vtk.vtkClipClosedSurface()
        clip1.SetClippingPlanes(xplaneColl1)
        clip1.SetInputConnection(clip.GetOutputPort())
        #clip1.SetActivePlaneColor(1.0,0,0)
        clip1.GenerateFacesOff()
        clip1.GenerateFacesOn()        
        
        
        normals = vtk.vtkPolyDataNormals()
        normals.SetInputConnection(clip1.GetOutputPort())
        normals.FlipNormalsOn()
        #normals.FlipNormalsOff()
        
        cutMapper = vtk.vtkDataSetMapper()
        cutMapper.SetInputConnection(normals.GetOutputPort())
        cutMapper.ScalarVisibilityOff()
        
        MapperM = vtk.vtkDataSetMapper()
        MapperM.SetInputConnection(normalsM.GetOutputPort())
        MapperM.ScalarVisibilityOff()
        
        actor = vtk.vtkActor()
        actor.SetMapper(cutMapper)
        actor.GetProperty().SetColor(self.instSp.doubleSpinBox_3.value(),self.instSp.doubleSpinBox_2.value(),self.instSp.doubleSpinBox.value())   # barva modelu
        
        actorM = vtk.vtkActor()
        actorM.SetMapper(MapperM)
        actorM.GetProperty().SetColor(0.1, 0.0, 0.0)
        actorM.GetProperty().SetOpacity(0.01)
        
        ren.AddActor(actor)   # řez 2x (ze zhora - ze spodu)
        ren.AddActor(actorM)  # celý model
        renWin.SetSize(self.rozlisX, self.rozlisY)
        cam = ren.GetActiveCamera()
        #cam.Elevation(20.0)
        ren.GetActiveCamera().ParallelProjectionOn()
        ren.ResetCamera()
        #cam.Azimuth(55)   # Elevation would spin about X
        cam.Zoom(self.zvets)
        cam.OrthogonalizeViewUp()
        ren.SetBackground(self.instSp.doubleSpinBox_6.value(), self.instSp.doubleSpinBox_5.value(), self.instSp.doubleSpinBox_4.value())
        
        renWin.Render()
        #iren.Start()
        
        

    # Umožňuje přesunout řez letadla tam a zpět pomocí vyvolání funkce
    # Střih s příslušnou hodnotu k rovině (v podstatě vzdálenost od
    # původní roviny).
        n=0
        for x in range (nRezu):
            n=n+self.tlRezu               # posun řezu
            time.sleep(self.cas)          # čas, prodleva mezi řezy
            o=10014+x
            o=str(o)
            xProgres =x+1
            n2= n-0.05
            self.progresRez=xProgres*100/nRezu
            self.insSV.progressBarRez.setProperty("value", self.progresRez) 
            plane.SetOrigin(0, 0, n)
            plane1.SetOrigin(0, 0, n2)
            normals.SetInputConnection(clip1.GetOutputPort())
            normalsM.SetInputConnection(clip.GetOutputPort())
            MapperM.Update()
            cutMapper.Update()
            renWin.Render()
            
                # uloží scenu  .png:
            if  x < self.par:
                
                nazev= o+".png"
                cesta= os.getcwd()+"/Rezy/"
                self.cesta = cesta
                fileName = cesta+nazev
    
                # screenshot code:
                w2if = vtk.vtkWindowToImageFilter()
                w2if.SetInput(renWin)
                w2if.Update()
                writer = vtk.vtkPNGWriter()
                writer.SetFileName(fileName)
                writer.SetInput(w2if.GetOutput())
                writer.Write()
            #zobrazí v okně aplikace
            #self.instSp.zobrazRez(fileName)
            #Korekce X
                img = Image.open(fileName)
                width, height = img.size
                max_dim = max(img.size)
                factor = self.korekceX
                side = int(max_dim*factor)
                resized_image = img.resize((side, self.rozlisY), Image.ANTIALIAS)
                #resized_image_file=fileName
                resized_image.save(fileName)
                #print("%s saved!" % resized_image_file)

#    def keyPressEvent(self, e):
#        """
#        Ukonci okno aplikace
#        """
#        if e.key() == Qt.Key_Escape:
#            self.close()  

    def onSrovnatSab(self):
        
        cesta= os.getcwd()+"/Rezy/"
#        slozky =os.listdir(cesta)
#        delka =len(slozky)
        nazev=10012
        
        file_list = os.listdir(cesta)

        for xx in file_list:    
            nazev=nazev+1
            naz=str(nazev)
            cestaObr=cesta+xx
            obrazek = Image.open(cestaObr) 
         #Přebarvý snímky
            img=obrazek
            img = img.convert("RGBA")
            pixdata = img.load()
            for y in xrange(img.size[1]):
                for x in xrange(img.size[0]):
                    if pixdata[x, y] == (255, 255, 255, 255):
                            pixdata[x, y] = (0, 0, 255, 255)
                for x in xrange(img.size[0]):
                    if pixdata[x, y] == (0, 0, 0, 255):
                            pixdata[x, y] = (75, 0, 0, 255)
            size = self.insSV.sirkaT.value(), self.insSV.vyskaT.value()              
            img = img.resize(size)               
            img.save(cestaObr, "PNG")
            if xx != "10000.png":  
                os.rename(os.path.join(cesta,xx), os.path.join(cesta,naz+'.png'))
               

    def ulozit(self, slozkaNazev):
        
        """
        Uloží do nového adresáře (Sablony) a smaže Řezy
        """
        cesta= os.getcwd()
        cestaRezy = cesta+"\\Rezy\\"
        slozky =os.listdir(cestaRezy)

        
        for x in slozky:
            src=cestaRezy+x
            dst=slozkaNazev+"\\"+x
            shutil.copyfile(src, dst)
            os.remove(src)
            print dst
            
            
#krajec = Krajec()
#krajec.platek("Model_Stl/kuzel.stl", 100, 5, 1, 0, 1, 1000, 1000)


